SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO
-- fnDiasdeLicencia
-- 23 - 10 - 2006
-- Retorna la cantidad de dias de un agente de una determinada licencia en un periodo en particular contando en dias habiles o corridos y teniendo en cuenta o no el turno segun parametros.
CREATE FUNCTION [dbo].[fnDiasDeLicenciaGeneral] (@Agente INT, @P_FDesde DATETIME, @P_FHasta DATETIME, @P_CodLic INT, @P_HoC VARCHAR(1), @Aplicacion INT, @Turno INT)  
RETURNS INT AS  
BEGIN 

-- APLICACION  1 = Al servicio especifico / 2 = A todos los servicios del mismo turno / 3 = A todos los servicios del agente
-- TURNOS 1 = Mañana / 2 = Tarde / 3 = Vespertino / 4 = Nocturno / 5 = Indefinido / 6 = Rotativo / 7 = Completo / 8 = Alternado

DECLARE @MFA DATETIME
DECLARE @MFB DATETIME
DECLARE @RFA DATETIME
DECLARE @RFB DATETIME
DECLARE @RBaja VARCHAR(1)
DECLARE @RSitLab INT
DECLARE @ContDias INT
DECLARE @dhdiff INT
DECLARE @msg VARCHAR(200)
DECLARE @Total INT, @diasadicionales INT
DECLARE @dh int
DECLARE @dw1 int
DECLARE @dw2 int


SELECT @ContDias = 0, @Total = 0

IF @Aplicacion = 2 -- Si se aplica a todos los servicios DEL MISMO TURNO
BEGIN
	DECLARE Licencias CURSOR FOR
	SELECT  CASE WHEN ss.FechaAlta < @P_FDesde THEN @P_FDesde ELSE SS.FechaAlta END AS FechaAlta, SS.Baja,
		  CASE WHEN ss.FechaBaja > @P_FHasta THEN @P_FHasta ELSE ss.FechaBaja END FechaBaja ,ss.SituacionLaboral
	FROM tb_SubServiciosAgentes ss, tb_ServiciosAgentes s, tb_Plazas p
	WHERE s.Agente=@agente 
	AND ( (SS.FechaBaja IS NULL) OR (SS.FechaBaja IS NOT NULL AND SS.FechaBaja >= @P_FDesde) )
	--AND ss.FechaAlta<@P_FHasta and ss.fechaalta >= @P_FDesde and licencia=@P_CodLic 
	AND ss.FechaAlta<@P_FHasta  and licencia=@P_CodLic 
	AND s.idServicioAgente = ss.ServicioAgente --d P.Division = idDivision
	AND idPlaza = Plaza --and p.Turno = @Turno
	ORDER BY ss.FechaAlta
	FOR READ ONLY
END
ELSE
BEGIN
	DECLARE Licencias  CURSOR FOR
	SELECT  CASE WHEN ss.FechaAlta < @P_FDesde THEN @P_FDesde ELSE SS.FechaAlta END AS FechaAlta, SS.Baja,
	CASE WHEN ss.FechaBaja > @P_FHasta THEN @P_FHasta ELSE ss.FechaBaja END FechaBaja ,ss.SituacionLaboral
	FROM tb_SubServiciosAgentes ss, tb_ServiciosAgentes s 
	where s.Agente=@agente 
	AND ( (SS.FechaBaja IS NULL) OR (SS.FechaBaja IS NOT NULL AND SS.FechaBaja >= @P_FDesde) )
	AND ss.FechaAlta<@P_FHasta and licencia=@P_CodLic 
	AND s.idServicioAgente = ss.ServicioAgente ORDER BY ss.FechaAlta	FOR READ ONLY
END

OPEN Licencias

FETCH NEXT FROM Licencias INTO @RFA,@RBaja,@RFB,@RSitLab

-- Considera la posibilidad de Cursor Vacio
IF @@FETCH_STATUS=0
	SELECT @MFA=@RFA,@MFB=DATEADD(DAY,0,@RFA),@ContDias=0

IF @RFA < @P_FDesde
	SELECT @RFA = @P_FDesde

-- Recorrido del Cursor (Proyeccion sobre X)
WHILE @@FETCH_STATUS=0 
	BEGIN	
	
	IF @RBaja='N' OR @RFB>@P_FHasta
		SELECT @RFB=@P_FHasta
	
	--SELECT @msg=' Dias '+convert(char,@ContDias)+' MFA='+convert(char,@MFA)+' MFB='+convert(char,@MFB)+' RFA='+convert(char,@RFA)+' RFB='+convert(char,@RFB)
	--PRINT @msg
	IF @RFA>@MFB
			BEGIN
			IF @P_HoC='C'
				SELECT @ContDias=@ContDias+(DATEDIFF(DAY,@MFA,@MFB)+1)
			ELSE
				BEGIN
					--EXECUTE @dhdiff=spdifdiashabiles @MFA,@MFB

					select @dw1=DatePart(dw,@MFA), @dw2=DatePart(dw,@MFB), @dh=(datediff(day,@MFA,@MFB)+ 1 - (datediff(wk,@MFA,@MFB)*2))
					if @dw1=6 
						select @dh=@dh-1
					if @dw2=7
						select @dh=@dh-1

					SELECT @ContDias=@ContDias+@dh
				END

			SELECT @MFA=@RFA,@MFB=@RFB
			END
	ELSE
			BEGIN
				IF  @RFB>@MFB 
					SELECT @MFB=@RFB
			END
	
	FETCH NEXT FROM Licencias INTO @RFA,@RBaja,@RFB,@RSitLab	
	
END

CLOSE Licencias
DEALLOCATE Licencias

if @P_HoC='C'
	SELECT @ContDias=@ContDias+(DATEDIFF(DAY,@MFA,@MFB)+1)
ELSE
BEGIN	--EXECUTE @dhdiff=spdifDiasHabiles @MFA,@MFB

	select @dw1=DatePart(dw,@MFA), @dw2=DatePart(dw,@MFB), @dh=(datediff(day,@MFA,@MFB)+ 1 - (datediff(wk,@MFA,@MFB)*2))
	if @dw1=6 
		select @dh=@dh-1
	if @dw2=7
		select @dh=@dh-1

	SELECT @ContDias=@ContDias+@dh
END

-- VER.
-- Si sin de las licencias que cuentan acumulacion de dias.
IF @P_CodLic IN (5,6,8,62)
BEGIN
	SELECT @diasadicionales =  SUM(ISNULL(Dias, 0)) FROM tb_LicenciasHistoricas WHERE Agente = @Agente AND Licencia = @P_CodLic
	IF @DiasAdicionales IS NULL
		SELECT @DiasAdicionales = 0
	SELECT @Total = @diasadicionales
END

SELECT @ContDias  = @ContDias + @Total

IF @ContDias IS NULL
	SELECT @ContDias = 0

RETURN(@ContDias)

END













GO
